import router from "@/router";

//加载views下的文件
const modules = require.context("@/views", true, /\.vue$/);

//递归菜单权限
export function filterRoutes(routes, includeNames) {
  const filteredRoutes = [];

  function filterRoute(route) {
    // 检查当前路由（可能是父路由）是否有匹配的名称
    const routeMatches = includeNames.some((name) => route.name.includes(name));

    // 检查子路由
    let hasMatchingChild = false;
    if (route.children) {
      const filteredChildren = route.children.filter((child) => {
        // 检查子路由名称是否匹配
        const childMatches = includeNames.some((name) =>
          child.name.includes(name)
        );
        if (childMatches) {
          hasMatchingChild = true; // 至少有一个子路由匹配
        }
        return childMatches; // 只保留匹配的子路由
      });

      // 如果子路由有变化（即过滤后子路由数量不同），则更新路由对象
      if (filteredChildren.length !== route.children.length) {
        route.children = filteredChildren;
      }
    }

    // 如果当前路由是父路由且至少有一个子路由匹配，或者当前路由本身就是匹配的（无子路由情况），则添加到结果中
    if ((route.children && hasMatchingChild) || routeMatches) {
      filteredRoutes.push(route);
    }
  }

  // 遍历所有路由并应用过滤逻辑
  routes.forEach(filterRoute);

  // 过滤掉那些现在为空子路由的父路由（如果需要）
  // 但在这个特定案例中，由于我们之前已经检查了至少有一个子路由匹配，所以这一步可能是多余的
  // 除非你还想进一步处理那些最初有子路由但现在没有（因为都被过滤掉了）的父路由

  return filteredRoutes;
}

// 递归构建路由函数
// 递归函数，用于添加嵌套路由
export function toAddRoute(routes, parentName = "Layout") {
  routes.forEach((route) => {
    if (route.children && route.children.length) {
      toAddRoute(route.name, {
        name: route.children.name,
        path: route.children.path,
        mata: route.children.meta,
        component: loadComponent(route.children.component),
        children: route.children ? route.children : [],
      }); // 递归添加子路由
    } else {
      // 添加到 Vue Router，如果 parentName 为空，则为顶级路由
      router.addRoute(parentName, {
        name: route.name,
        path: route.path,
        mata: route.meta,
        component: loadComponent(route.component),
        children: route.children ? route.children : [],
      });
    }
  });
}

// function loadComponent(componentName) {
//   return () => import(`@/views/${componentName}`);
// }
function loadComponent(componentName) {
  // 尝试从 modules.keys() 中找到匹配的组件
  const matched = modules
    .keys()
    .find((key) => key.endsWith(`/${componentName}.vue`));
  if (!matched) {
    return null;
  }

  // 使用 require.context 返回的函数加载组件
  const component = modules(matched).default;
  return component;
}
